<?php
namespace mysdk\lib\Utils;

/**
 * Created by PhpStorm.
 * User: LXN
 * Date: 2018/6/28
 * Time: 18:00
 */
class Tools
{

    /**
     * 将xml转换为数组
     * @param $xml  需要转化的xml
     * @return mixed
     */
    static function xml_to_array($xml)
    {
        $ob = simplexml_load_string($xml);
        $json = json_encode($ob);
        $array = json_decode($json, true);
        return $array;
    }


    /**
     * 将数组转化成xml
     * @param $data 需要转化的数组
     * @return string
     */
    static function data_to_xml($data)
    {
        if (is_object($data)) {
            $data = get_object_vars($data);
        }
        $xml = '';
        foreach ($data as $key => $val) {
            if (is_null($val)) {
                $xml .= "<$key/>\n";
            } else {
                if (!is_numeric($key)) {
                    $xml .= "<$key>";
                }
                $xml .= (is_array($val) || is_object($val)) ? self::data_to_xml($val) : $val;
                if (!is_numeric($key)) {
                    $xml .= "</$key>";
                }
            }
        }
        return $xml;
    }


    /**
     * 接收xml数据并转化成数组
     * @return array
     */
    static function getRequestBean()
    {
        $bean = simplexml_load_string(file_get_contents('php://input')); // simplexml_load_string() 函数把 XML 字符串载入对象中。如果失败，则返回 false。
        $request = array();
        foreach ($bean as $key => $value) {
            $request [( string )$key] = ( string )$value;
        }
        return $request;
    }


    /**
     * 接收json数据并转化成数组
     * @return mixed
     */
    static function getJsonData()
    {
        $bean = file_get_contents('php://input');
        $result = json_decode($bean, true);
        return $result;
    }



    /**
     * 获取当前服务器系统
     * @return string
     */
    public static function getOS()
    {
        if (PATH_SEPARATOR == ':') {
            return 'Linux';
        } else {
            return 'Windows';
        }
    }


    /**
     * 写日志
     * @param $log  日志内容
     * @param $dir  保存路径
     */
    static function writeLog($log, $dir='')
    {
        if(empty($dir)){
            $dir = __DIR__ . "/../Log/";
        }

        if (!is_dir($dir)) {
            mkdir($dir);
        }
        $filename = $dir . date("Y-m-d") . ".log";
        file_put_contents($filename, date("Y-m-d H:i:s") . "\t" . $log . PHP_EOL, FILE_APPEND);
    }


    /**
     * 二维数组跟据某个值排序
     * @param $array            排序的数组
     * @param $field            排序字集
     * @param string $sort      排序方式， SORT_ASC：升序排列，SORT_DESC：降序排列
     * @return mixed
     */
    static function arraySort($array, $field, $sort = 'SORT_ASC')
    {
        $arrSort = array();
        foreach ($array as $uniqid => $row) {
            foreach ($row as $key => $value) {
                $arrSort[$key][$uniqid] = $value;
            }
        }
        array_multisort($arrSort[$field], constant($sort), $array);
        return $array;
    }

    /**
     * 时间戳转多少时间前，如：30秒前
     * @param $time 时间戳
     * @return string
     */
    static function formatDate($time){
        $t = time() - $time != 0?time() - $time:1;
        $f = array(
            '31536000'=>'年',
            '2592000'=>'个月',
            '604800'=>'星期',
            '86400'=>'天',
            '3600'=>'小时',
            '60'=>'分钟',
            '1'=>'秒'
        );
        foreach ($f as $k=>$v){
            if (0 !=$c=floor($t/(int)$k)){
                return $c.$v.'前';
            }
        }
    }

    /**
     * 把秒转换成时间
     * @param $time
     * @return bool|string
     */
    static function formatDate2($time){
        if(is_numeric($time) && $time > 0){
            $date = '';
            $value = array(
                "years" => 0, "days" => 0, "hours" => 0,
                "minutes" => 0, "seconds" => 0,
            );

            if($time >= 31556926){
                $value["years"] = floor($time/31556926);
                $date .= $value["years"] ."年";
                $time = ($time%31556926);
            }

            if($time >= 86400){
                $value["days"] = floor($time/86400);
                $date .= $value["days"] ."天";
                $time = ($time%86400);
            }

            if($time >= 3600){
                $value["hours"] = floor($time/3600);
                $date .= $value["hours"] ."小时";
                $time = ($time%3600);
            }

            if($time >= 60){
                $value["minutes"] = floor($time/60);
                $date .= $value["minutes"] ."分";
                $time = ($time%60);
            }

            $value["seconds"] = floor($time);
            $date .= $value["seconds"] ."秒";

            return $date;

        }else{
            return false;
        }
    }

    /**
     * PHP判断当前协议是否为HTTPS
     */
    public static function is_https()
    {
        if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {
            return true;
        } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
            return true;
        } elseif (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') {
            return true;
        }
        return false;
    }

    /**
     * 正则：手机号（精确）
     * <p>移动：134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188、198</p>
     * <p>联通：130、131、132、145、155、156、175、176、185、186、166</p>
     * <p>电信：133、153、173、177、180、181、189、199</p>
     * <p>全球星：1349</p>
     * <p>虚拟运营商：170</p>
     */
    static function is_mobile($text)
    {
        $search = '/^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0-9])|(18[0-9])|166|198|199|(147))\\d{8}$/';
        if (preg_match($search, $text)) {
            return (true);
        } else {
            return (false);
        }
    }

    /*
     * 过滤emoji表情
     */
    static function filterEmoji($str)
    {
        $str = preg_replace_callback(
            '/./u',
            function (array $match) {
                return strlen($match[0]) >= 4 ? '' : $match[0];
            },
            $str);
        return $str;
    }

    /**
     * 毫秒级时间戳
     * @return float
     */
    static function timeMillisecond()
    {
        list($t1, $t2) = explode(' ', microtime());
        return (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);
    }

}

?>